package com.kim.authorization.server.config.jwt;

import com.kim.oauth.common.model.UserAccount;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.token.TokenEnhancer;

import java.util.HashMap;
import java.util.Map;

/**
 * 自定义token增强器
 * <p>
 * 暂时弃用如想增强token内容可从tokenInfo接口实现
 * 既 扩展token内容 而后预留tokenInfo接口解析获取扩展内容即可
 * </p>
 */
@Slf4j
public class CustomTokenEnhancer implements TokenEnhancer {

    /**
     * 用户id属性
     */
    private static final String USER_ID = "id";

    /**
     * 用户密码属性
     */
    private static final String USER_PASSWORD = "password";

    /**
     * 用户名属性
     */
    private static final String USER_USERNAME = "username";

    /**
     * token增强
     * <p>此结果将随token一同返回</p>
     * <p>
     * 一顿搞  也没整对，认证的时候都可以拿到{@code OAuth2Authentication}中的用户认证信息
     * 可能刷新token是反的，到这个地方没有用户认证信息的
     * 先这样，这个地方最好还是先不要用吧，外面有tokenInfo可以获取token中信息
     * 如果必须要使用这个增强其也是可以的
     * {@code   // 拿到增强器链
     * TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
     * // 指定自定义token增强器到自定义tokenConverter
     * enhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer,jwtAccessTokenConverter));
     * // 配置tokenStore
     * endpoints.tokenStore(jwtTokenStore)
     * // 设置自定义token转换器
     * .accessTokenConverter(jwtAccessTokenConverter)
     * // 设置增强器链
     * .tokenEnhancer(enhancerChain);
     * }
     * </p>
     *
     * @param oAuth2AccessToken    原token
     * @param oAuth2Authentication 用户认证信息
     * @return org.springframework.security.oauth2.common.OAuth2AccessToken
     */
    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) {
        log.info("enhance --->  CustomTokenEnhancer ");
        final Map<String, Object> additionalInfo = new HashMap<>(8);
        if (null == oAuth2Authentication.getDetails()) {
            // 用户账户ID
            additionalInfo.put(USER_ID, null);
            // 是否设置密码
            additionalInfo.put(USER_PASSWORD, false);
            // 用户名
            additionalInfo.put(USER_USERNAME, null);
        } else {
            // 当前用户详情
            UserAccount userAccount = (UserAccount) oAuth2Authentication.getPrincipal();

            // 用户账户ID
            additionalInfo.put(USER_ID, userAccount.getId());
            // 是否设置密码
            additionalInfo.put(USER_PASSWORD, StringUtils.isNotEmpty(userAccount.getPassword()));
            // 用户名
            additionalInfo.put(USER_USERNAME, userAccount.getUsername());
        }
        // 设置到token中
        ((DefaultOAuth2AccessToken) oAuth2AccessToken).setAdditionalInformation(additionalInfo);
        return oAuth2AccessToken;
    }
}
